package org.design.patterns.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;

public class CglibProxyMode {

    // 代理接口，即房东和中介的协议。
    public interface IHouse {
        // 房租
        String getPrice();

        // 是否同意出租
        boolean agree(int price);
    }

    // 目标类，即房东
    public static class HouseMaster implements IHouse {

        @Override
        public String getPrice() {
            return "房东：房租5000元";
        }

        @Override
        public boolean agree(int price) {
            if (price > 4500) {
                return true;
            }
            return false;
        }
    }

    // 调用方，即租客
    public static void main(String[] args) {
        // 找个有房子的中介
        HouseMaster houseMaster = new HouseMaster();
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(houseMaster.getClass());
        enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> {
            if ("getPrice".equals(method.getName())) {
                System.out.println("中介：开始查找房源");
                System.out.println("中介：介绍房子信息");
                String price = (String) methodProxy.invokeSuper(o,objects);
                System.out.println(price);
                return "中介：可以讲价";
            } else if ("agree".equals(method.getName())) {
                System.out.println("中介：租客出价4800");
                return methodProxy.invokeSuper(o, objects);
            }
            return null;
        });
        IHouse house = (IHouse) enhancer.create();
        // 找中介租房子,问问房子的价格
        System.out.println(house.getPrice());
        // 我出4800，看看房东是否同意。
        System.out.println("房东：" + (house.agree(4800) ? "同意" : "不同意") + "出租");
    }
}
